<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>处理大数值不准确</title>
</head>
<body>

</body>
<script>
  // JSON 序列化会将所有数值类型转换为 Number，如果对象中有超过 JavaScript 安全整数范围的大数值（即 Number.MAX_SAFE_INTEGER 
  // 和 Number.MIN_SAFE_INTEGER），这些数值可能会丢失精度。

  // const bigNumber = 9007199254740993; // 超过 2^53
  // const jsonString = JSON.stringify({ value: bigNumber });
  // console.log(jsonString); // 输出 {"value":9007199254740992}，精度丢失


  // 解决方案
  // 使用 BigInt 或字符串来处理超大整数。

  // const bigNumber = BigInt("9007199254740993");
  // const jsonString = JSON.stringify({ value: bigNumber.toString() });
  // console.log(JSON.parse(jsonString)); // 输出 {"value":"9007199254740993"}，精度保留



  // 2. 浮点数精度问题
  // 浮点数的表示会导致精度问题，尤其是在序列化和反序列化过程中。

  // 问题
  // const num = 0.1 + 0.2;
  // const jsonString = JSON.stringify({ value: num });
  // console.log(jsonString); // 输出 {"value":0.30000000000000004}

  // 解决方案
  // 处理浮点数时，可以限制小数位数或使用适当的库来处理精度问题。
  const num = parseFloat((0.1 + 0.2).toFixed(10));
  const jsonString = JSON.stringify({ value: num });
  console.log(jsonString); // 输出 {"value":0.3}

</script>
</html>